/* Copyright (c) 2004-2024 peigen.info. All rights reserved. */
package info.peigen.hotpot.common.service.base.processor;

import cn.hutool.core.util.ObjectUtil;
import info.peigen.hotpot.common.core.result.ResultBase;
import info.peigen.hotpot.common.service.base.exception.BusinessException;
import jakarta.validation.ConstraintViolationException;
import org.yaml.snakeyaml.constructor.DuplicateKeyException;

/**
 * <b>(ProcessorServiceInvoke)</b>
 * 服务层接口,待具体的服务去实现
 *
 * @author Peigen
 * @version 1.0.0
 * @since 2022/5/26
 */
@SuppressWarnings({"rawtypes", "unchecked", "unused"})
public interface ProcessorServiceInvoke {

    /**
     * 增加预处理处理器
     *
     * @param serviceContext 服务上下文
     */
    default void addPreProcessor(ProcessorServiceContext serviceContext) {

    }

    /**
     * 增加业务执行处理器
     *
     * @param serviceContext 服务上下文
     */
    void addProcessor(ProcessorServiceContext serviceContext);

    /**
     * 增加后处理处理器
     *
     * @param serviceContext 服务上下文
     */
    default void addPostProcessor(ProcessorServiceContext serviceContext) {

    }

    /**
     * 根据不同的情况下，对于异常的处理<br/>
     *
     * @param e              异常
     * @param serviceContext 服务上下文
     */
    default void handleException(Exception e, ProcessorServiceContext serviceContext) {
        // 初始化一个空的Result
        if (ObjectUtil.isNull(serviceContext.getResult())) {
            serviceContext.setResult(new ResultBase());
        }

        // 入参校验异常
        if (e instanceof ConstraintViolationException || e instanceof IllegalArgumentException) {
            serviceContext.getResult().setFailForParaError(e.getMessage());
            return;
        }

        // 幂等性异常
        if (e instanceof DuplicateKeyException) {
            serviceContext.getResult().setFail("受到幂等性控制!");
            return;
        }

        if (e.getCause() instanceof BusinessException be) {
            serviceContext.getResult().setFail(be.code(), be.message());
            return;
        }
        serviceContext.getResult().setFail(e.getMessage());
    }
}